Các hệ thống Unix và tương tự Unix Tập tin thiết bị

Một cấu trúc đơn giản của nhân Linux. Hệ thống tập tin được triển khai như một phần của hệ thống con I/O.

Các nút thiết bị tương ứng với các tài nguyên mà nhân của hệ điều hành đã được cấp phát. Unix xác định các tài nguyên đó bằng một số chính và một số phụ,[4] cả hai đều được lưu trữ như một phần của cấu trúc nút. Việc gán những con số này xảy ra duy nhất trong các hệ điều hành khác nhau và trên các nền tảng máy tính khác nhau. Nói chung, số chính xác định driver thiết bị và số phụ xác định một thiết bị cụ thể (nếu có nhiều thiết bị) mà driver đang phân phối:[5] trong trường hợp này, hệ thống có thể chuyển số phụ cho driver. Tuy nhiên, điều này có thể không xảy ra trong trường hợp phân bổ số động (ví dụ: FreeBSD 5 trở lên).

Cũng như các loại tập tin đặc biệt khác, hệ thống máy tính truy cập các nút thiết bị bằng cách sử dụng các lệnh gọi hệ thống tiêu chuẩn và xử lý chúng như các tập tin máy tính thông thường. Hai loại tập tin thiết bị tiêu chuẩn tồn tại; Thật không may, tên của chúng khá phản trực giác vì những lý do lịch sử và kết quả còn lại ta có được là những giải thích không mấy chính xác về sự khác biệt giữa chúng.

Character device

Character special file hoặc character device không có bộ đệm, có quyền truy cập trực tiếp vào thiết bị phần cứng. Chúng không nhất thiết cho phép các chương trình đọc hoặc viết các ký tự đơn lẻ tại một thời điểm; điều đó tùy thuộc vào thiết bị truy cập. Ví dụ, character device cho đĩa cứng sẽ yêu cầu tất cả các lần đọc và ghi phải được căn chỉnh để chặn các ranh giới và chắc chắn sẽ không cho phép đọc một byte đơn lẻ.

Các character device đôi khi được gọi là raw device để tránh sự nhầm lẫn, sự thật là một character device cho phần cứng dựa trên khối thường sẽ yêu cầu các chương trình đọc và ghi các khối đã được căn chỉnh.

Block device

Block special file hay block device cung cấp quyền truy cập có đệm vào các thiết bị phần cứng và cung cấp một số thông tin tóm tắt từ các chi tiết cụ thể của chúng.[6] Không giống như các character device, các block device sẽ luôn cho phép lập trình viên đọc hoặc ghi một khối có kích thước bất kỳ (bao gồm các ký tự hoạc byte đơn lẻ) và bất kỳ liên kết nào. Nhược điểm là bởi vì các block device được lưu vào bộ đệm, lập trình viên không biết sẽ mất bao lâu trước khi dữ liệu đã ghi được chuyển từ bộ đệm của nhân đến thiết bị thực hoặc phải theo thứ tự hai lần ghi riêng biệt mới đến thiết bị vật lý. Ngoài ra nếu cùng một phần cứng mà hiển thị cả character device và block device thì phần cứng đó sẽ có nguy cơ bị hỏng dữ liệu do khách hàng sử dụng character device không biết về những thay đổi được thực hiện trong bộ đệm của block device.

Hầu hết các hệ thống tạo ra cả block device và character device để đại diện cho phần cứng như đĩa cứng. Đáng chú ý điều đó không áp dụng với FreeBSD và Linux; người trước thì đã loại bỏ hỗ trợ cho các block device,[7] trong khi người sau chỉ hỗ trợ tạo ra các block device. Trong Linux, để có được character device cho đĩa, người ta phải sử dụng một "raw" driver, mặc dù người ta có thể nhận được kết quả tương tự như sử dụng character device bằng cách mở block device bằng cờ O_DIRECT.

Thiết bị giả

Các nút thiết bị trên các hệ thống tương tự Unix không nhất thiết phải tương ứng với các thiết bị vật lý. Các nút thiếu sự tương ứng này tạo thành nhóm thiết bị giả. Chúng cung cấp các chức năng khác nhau do hệ điều hành xử lý. Một số thiết bị giả (dựa trên ký tự) được sử dụng phổ biến nhất bao gồm:

  • /dev/null – cho phép và từ chối tất cả đầu vào được ghi vào nó; cung cấp kết thúc tập tin mỗi khi được đọc.
  • /dev/zero – cho phép và từ chối tất cả đầu vào được ghi vào nó; tạo ra một dòng liên tục các ký tự rỗng (byte có giá trị không) khi cố gắng đọc dữ liệu từ nó
  • /dev/full – tạo ra một dòng liên tục các ký tự rỗng (byte có giá trị không) khi cố gắng đọc dữ liệu từ nó và tạo ra lỗi ENOSPC ("đầy bộ nhớ") khi cố gắng ghi vào nó.
  • /dev/random – tạo ra các byte được tạo bởi trình tạo số giả ngẫu nhiên an toàn bằng mật mã của nhân. Hành vi của nó thay đổi tùy theo cách triển khai và đôi khi các biến thể như /dev/urandom hay /dev/arandom cũng được sử dụng.

Ngoài ra, các thiết bị giả dành riêng cho BSD có giao diện ioctl cũng có thể bao gồm:

  • /dev/pf – cho phép các quy trình vùng người dùng kiểm soát PF thông qua giao diện ioctl.
  • /dev/bio – cung cấp ioctl quyền truy cập vào các thiết bị không được thấy dưới dạng nút của /dev, được bioctl sử dụng để triển khai quản lý RAID trong OpenBSDNetBSD.
  • /dev/sysmon – được sử dụng bởi khung envsys của NetBSD để giám sát phần cứng, được truy cập trong vùng người dùng thông qua proplib(3) bởi tiện ích envstat.[8]

Tạo nút

Các nút được tạo bởi lệnh gọi hệ thống mknod. Chương trình dòng lệnh để tạo các nút còn được gọi là mknod. Các nút có thể được di chuyển hoặc xóa bằng các lệnh gọi hệ thống tập tin thông thường (rename, unlink) và các lệnh (mv, rm).

Một số phiên bản Unix có sẵn một tập lệnh có tên là makedev hay MAKEDEV để tạo tất cả các thiết bị cần thiết trong thư mục /dev. Nó chỉ có ý nghĩa trên các hệ thống có thiết bị được gán số chính tĩnh (ví dụ: bằng cách mã hóa cứng nó trong mô-đun nhân của hệ điều hành).

Trong khi một số hệ thống Unix khác như FreeBSD chỉ sử dụng quản lý nút thiết bị dựa trên nhân thông qua devfs và không hỗ trợ tạo nút thủ công. Lệnh gọi hệ thống mknod(2) và lệnh mknod(8) tồn tại để giữ khả năng tương thích với POSIX, các nút thiết bị được tạo thủ công bên ngoài devfs tất nhiên sẽ không hoạt động.[9]

Quy ước đặt tên

Các tiền tố sau được sử dụng cho tên của một số thiết bị trong phân cấp /dev để xác định loại thiết bị:

Một số tiền tố bổ sung đã được sử dụng phổ biến trong một số hệ điều hành:

  • fb: bộ đệm khung (frame buffer)
  • fd: (nền tảng) đĩa mềm, mặc dù cách viết tắt tương tự này cũng thường được sử dụng để chỉ trình mô tả tập tin
  • hd: ("cổ điển") driver IDE (trước đây được sử dụng cho ổ đĩa cứng ATA, ổ đĩa quang ATAPI,...)
    • hda: thiết bị chính trên kênh ATA đầu tiên (thường được xác định bằng số chính 3 và số phụ 0)
    • hdb: thiết bị phụ trên kênh ATA đầu tiên
    • hdc: thiết bị chính trên kênh ATA thứ hai
    • hdd: thiết bị phụ trên kênh ATA thứ hai
  • parport, pp: các cổng song song
  • mem: Bộ nhớ chính (character device)
  • driver NVMe
    • nvme0: driver của thiết bị đã đăng ký đầu tiên (character device)
    • nvme0n1: không gian tên đầu tiên của thiết bị được đăng ký đầu tiên (block device)
    • nvme0n1p1: phân vùng đầu tiên của không gian tên đầu tiên của thiết bị được đăng ký đầu tiên (block device)
  • driver MMC
    • mmcblk: driver lưu trữ cho MMC Media (thẻ SD, chip eMMC trên máy tính xách tay,...)
      • mmcblk0: thiết bị đăng ký đầu tiên
      • mmcblk0p1: phân vùng đầu tiên của thiết bị được đăng ký đầu tiên
  • driver SCSI cũng được sử dụng bởi libATA (driver PATA/SATA hiện đại), USB, IEEE 1394,...
    • sd: driver lưu trữ hàng loạt (block device)
      • sda: thiết bị đăng ký đầu tiên
      • sdb, sdc,...: thiết bị đã đăng ký thứ hai, thứ ba,...
    • ses: Driver bọc
    • sg: lớp SCSI chung
    • sr: driver "ROM" (ổ đĩa quang định hướng dữ liệu; scd chỉ là một bí danh phụ)
    • st: driver băng từ
  • tty: terminal
    • ttyS: (nền tảng) driver cổng nối tiếp
    • ttyUSB: Bộ chuyển đổi nối tiếp USB, modem,...

Danh sách chuẩn của các tiền tố được sử dụng trong Linux có thể được thấy trong danh sách thiết bị Linux, sổ đăng ký chính thức của số thiết bị được phân bổ và các nút thư mục /dev cho hệ điều hành Linux.[10]

Đối với hầu hết các thiết bị, tiền tố này được theo sau bởi một số nhận dạng thiết bị duy nhất cụ thể. Đối với ổ cứng, một ký tự được sử dụng để xác định thiết bị và theo sau là một số để xác định phân vùng. Vì vậy, một hệ thống tập tin có thể "biết" một khu vực trên đĩa là /dev/sda3 chẳng hạn, hoặc "thấy" một terminal đã nối mạng được liên kết với /dev/pts/14.

Trên các đĩa sử dụng bản ghi khởi động chính của máy tính, số thiết bị của phân vùng chính và phân vùng mở rộng tùy chọn được đánh số từ 1 đến 4 trong khi chỉ mục của bất kỳ phân vùng logic nào là 5 trở đi, bất kể bố cục của phân vùng cũ (vùng đã sinh chúng mở rộng phân vùng không cần phải là phân vùng thứ 4 trên đĩa cũng như không cần phải tồn tại ở cả 4 phân vùng chính).

Tên thiết bị thường thay đổi giữa các biến thể hệ thống tương tự Unix khác nhau, ví dụ: trên một số hệ thống BSD, thiết bị IDE được đặt tên là /dev/wd0, /dev/wd1,...

devfs

devfs là một hệ thống tích hợp của hệ thống tập tin thiết bị trên hệ điều hành tương tự Unix, được sử dụng để hiển thị tập tin thiết bị. Cơ chế triển khai cơ bản có thể khác nhau, tùy thuộc vào hệ điều hành.

Việc duy trì các tập tin đặc biệt này trên hệ thống tập tin được thực hiện vật lý (ví dụ như bằng ổ cứng,...) không thuận tiện và vì dù sao nó cũng cần hỗ trợ nhân nên ý tưởng về một hệ thống tệp logic có mục đích đặc biệt là để tránh lưu trữ vật lý.

Ngoài ra, việc xác định thời điểm các thiết bị sẵn sàng xuất hiện không hoàn toàn là chuyện nhỏ. Cách tiếp cận của 'devfs' tới driver thiết bị là yêu cầu tạo và xóa các mục 'devfs' liên quan đến thiết bị mà nó kích hoạt hoặc vô hiệu hóa.

Liên quan

Tài liệu tham khảo

WikiPedia: Tập tin thiết bị http://www-128.ibm.com/developerworks/library/l-fs... http://www-128.ibm.com/developerworks/library/l-fs... http://www-128.ibm.com/developerworks/linux/librar... http://www.linuxjournal.com/article/6035 http://support.microsoft.com/kb/102985 http://support.microsoft.com/kb/120740/a http://support.microsoft.com/kb/74496/en-us http://support.microsoft.com/kb/90239 http://sg.danny.cz/scsi/devfs_scsi.html http://freemint.de/docs/mint.mint_doc.html